#include<bits/stdc++.h> 
using namespace std;
// 	城市之间通过高速公路的连接在战争中非常重要，如果一个城市被敌人占领了，那么
//	从这个城市来以及到这个城市去的路都封起来。如果我们要保持其他城市继续连接我
//	们必须迅速知道需要修复哪些通路。给定包含所有高速公路信息的城市地图，我需要
//	标注出需要修复的道路。比如由3个城市c1c2c3，与两条高速公路c1-c2，c1-c3，当
//	c1被占领的时候，我们需要修复一条路叫c2-c3来保持剩下两座城市的连接 
//1.每个输入具有一个测试用例，测试用例由三部分组成，第一行是3个数字N，M和K，其 
//  中N<1000，N表示城市的总个数，M表示高速公路的总条数，K表示需要检查的城市，城
//  市编号由1-N 
//2.接下来M行用来表示M条路，包括两个正整数，是连接的两个城市c1和c2。 
//3.接下来一行包含K个数字，表示我们关心的从城市 
//4.对于每一个测试用例，输出如果该城市被占领后需要修复的道路总数 
//5. vector，BFS，无向图 
vector<int> graph[1001];	//用于存放每个城市相关联的城市 
bool matrix[1001];	//某个城市是否能够联通，开一个1001大小的数组，0不用，从1开始用 
int lost, count_;	//定义全局变量表示某座被占领的城市，以及计数用的count_ 
void BFS(int now){	//BFS的函数体，传入一个不连通的城市 
	queue<int> Q;	//定义一个队列用于BFS 
	Q.push(now);	//将now推入 
	matrix[now] = true;	//并把now置为true表示连通 
	while(!Q.empty()){	//只要Q不为空 
		int frt = Q.front();	//取队列最前面元素并弹出 
		Q.pop();
		for(int i = 0;i<graph[frt].size();i++){	//遍历该元素的连通城市 
			if(graph[frt][i]!=lost&&matrix[graph[frt][i]]==false){	//如果这个连通城市不是被占领的城市，且目前还没被连通过 
				Q.push(graph[frt][i]);	//将它推入队列中 
				matrix[graph[frt][i]] = true;	//并把这个城市置为连通状态 
			}
		}
	}
}
int main(){
	int N,M,K;
	cin>>N>>M>>K;	//输入N、M、K这三个数据 
	int ca, cb;
	for(int i=0;i<M;i++){
		cin>>ca>>cb;	//输入一条路连接的两个城市 
		graph[ca].push_back(cb);	//在前者的关联城市向量中插入后者，下同 
		graph[cb].push_back(ca);
	}

	for(int i=0;i<K;i++){	
		count_=0;	//计数清零 
		cin>>lost;	//输入某座需要假设占领的城市 
		fill(matrix+1, matrix+N+1,false);	//由于城市的编号由1-N，则用fill函数填充1-N，全部赋值False 
		for(int j=1;j<N+1;j++){	//从1-N号城市开始遍历 
			if(j==lost){	//如果第j个城市就是占领的城市，则直接进行下一次循环 
				continue;
			}	
			if(matrix[j]==false){	//否则，如果该城市不连通，则开始广度搜索，然后进行连通，并且计数+1 
				BFS(j);	
				++count_;	//计数加1，第一次进入的时候是因为全部都置为false了所以需要，因此后面输出的时候要--。而之后每一次遇到false都表明从某个城市出发无论如何都到达不了这个城市，因此需要建立一条路 
			}
		}
		cout<<--count_<<endl;	//刚提到的第一次计数多加的1减掉 
	}
	return 0;
	
} 